//
// Created by QU on 24-6-20.
//
#include <iostream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <new>
#include <thread>
#include <algorithm>
#include <array>
#include <string>
#include <deque>


// 嵌套namespace
namespace aquawius
{
    // [[deprecated]] 可以加在namespace上, 配合inline达到弃用的目的.  编译器将会正常发出警告.
    namespace [[deprecated]] ver1
    {
        // 如果想使用这个函数, 需要使用 aquawius::ver1::foo()
        [[deprecated("ver1 namespace is deprecated, use aquawius::foo() instead")]]
        void foo()
        {
            std::cout << "foo" << std::endl;
        }
    }

    // 使用inline关键字, 将下面的命名空间

    inline namespace ver2
    {
        // 如果想使用这个函数, 需要使用 aquawius::ver2::foo()
        // 或者使用 aquawius::foo()
        void foo()
        {
            std::cout << "foo" << std::endl;
        }
    }
}

// c++17 开始可以使用嵌套命名空间的简化代码, 但是inline没有加入标准
namespace aqua::ver1
{
    void foo()
    {
        std::cout << "foo" << std::endl;
    }
}

// c++20 可以使用简化的嵌套明明空间的 inline关键字
namespace aqua:: inline ver2
{
    void foo()
    {
        std::cout << "foo" << std::endl;
    }
}

using std::cout, std::cin, std::endl;

int main(int argc, const char* argv[])
{
    // 使用inline等价
    aquawius::ver1::foo();
    aquawius::foo();
    aquawius::ver2::foo();
    // 既然使用了inline, 上面的ver2版本应该是deprecated, 直接使用第一行的就可以.
    return 0;
}
